%CD%





#!/bin/bash
# 项目根目录
BASE_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && cd .. && pwd )"
# jar 文件名称 默认项目根目录下的第一个 jar 文件
JAR_NAME=""
# Java 命令全路径 默认使用项目自带 Java 不存在则使用系统环境的 Java
JAVA_COMMAND=""
# Java 命令参数配置
JAVA_OPTS=""
# pid
PID=""

# 获取 Java 命令地址
get_java_command(){
  # 检查是否存在内置 Java
  if [ -d "${BASE_DIR}/jdk" ]; then
    # 存在时就使用自带的 java
    JAVA_COMMAND="${BASE_DIR}/jdk/bin/java"
  else
    # 检查用户环境是否存在 Java 命令
    if type java >/dev/null 2>&1; then
      # 存在时就使用用户环境的 Java
      JAVA_COMMAND="java"
    else
      echo 'Java 运行环境不存在 检查环境配置'
      exit 1
    fi
  fi
}

# 获取 jvm 配置
get_jvm_config(){
  # 判断 jvm.conf 文件是否存在
  if [ -f "${BASE_DIR}/config/jvm.conf" ]; then
    for line in `cat ${BASE_DIR}/config/jvm.conf`
    do
      JAVA_OPTS="${JAVA_OPTS} ${line}"
    done
  fi
}

# 获取 logback 配置
get_logback_config(){
  # 判断 jvm.conf 文件是否存在
  if [ -f "${BASE_DIR}/config/logback-spring.xml" ]; then
    # 指定 logback 配置文件 和 日志输出位置
    JAVA_OPTS="${JAVA_OPTS} -Dlogging.config=${BASE_DIR}/config/logback-spring.xml -Dlog.file.path=${BASE_DIR}/logs"
  fi
}

# 设置 spring 项目配置目录
set_spring_config(){
  # 配置文件目录使用项目根目录下的 config 文件夹
  JAVA_OPTS="${JAVA_OPTS} -Dspring.config.location=${BASE_DIR}/config/"
}

# 获取运行项目的 jar 名称
get_jar_name(){
  # 获取项目根目录下的 jar 文件列表
  FILES=`ls ${BASE_DIR} | grep .jar`
  # 取第一个 jar 文件名称设置为项目的 jar 名称
  JAR_NAME=${FILES[0]}
  # 检查名称是否存在
  if [ -n "${JAR_NAME}" ]; then
    echo "项目根目录下的 jar 文件为 ${JAR_NAME}"
  else
    echo '停止启动 项目根目录下没有可运行的 jar 文件'
    exit 1
  fi
}

# 通过 pid.file 文件获取项目运行状态
get_app_status(){
  # 检查 pid.file 文件是否存在 新项目部署时默认不存在 初次启动后会生成 pid.file 文件
  if [ -f "${BASE_DIR}/bin/pid.file" ]; then
    # 存在 pid.file 文件时 设置 PID 变量
    PID=`cat ${BASE_DIR}/bin/pid.file`
    # 检查 pid 是否为空
    if [ -n "${PID}" ]; then
      # pid 不为空
      # 通过 PID 检查是否存在有运行的进程
      EXIST=`ps -p ${PID} -o pid=`
      if [ -n "${EXIST}" ]; then
        # 存在 PID 对应的进程
        echo "停止启动 程序正在运行中 pid 为 ${PID}"
        exit 1
      else
        # 不存在 PID 对应的进程
        echo "项目不在运行中 pid 为 ${PID}"
      fi
    fi
  else
    # 不存在 pid.file 文件时
    echo "pid.file 文件不存在 无法获取项目运行状态或者项目不在运行中"
  fi
}

# 运行项目
start_app(){
  get_java_command
  get_jvm_config
  get_logback_config
  set_spring_config
  get_jar_name
  get_app_status
  # 运行启动命令
  nohup ${JAVA_COMMAND} -jar ${JAVA_OPTS} ${BASE_DIR}/${JAR_NAME} > /dev/null 2>&1 & echo $! > ${BASE_DIR}/bin/pid.file
  echo "${JAR_NAME} 启动完毕 启动命令为"
  echo "nohup ${JAVA_COMMAND} -jar ${JAVA_OPTS} ${BASE_DIR}/${JAR_NAME} > /dev/null 2>&1 & echo $! > ${BASE_DIR}/bin/pid.file"
  echo "执行以下命令查看启动日志"
  echo "tail -f ${BASE_DIR}/logs/error.log"
  echo "tail -f ${BASE_DIR}/logs/info.log"
}

start_app

